Handle offset in treesit--update-ranges-local (bug#77848)
authorYuan Fu <casouri@gmail.com>
Fri, 18 Apr 2025 23:22:45 +0000 (16:22 -0700)
committerYuan Fu <casouri@gmail.com>
Fri, 18 Apr 2025 23:24:11 +0000 (16:24 -0700)
* lisp/treesit.el:
(treesit--update-ranges-local): Add OFFSET parameter.
(treesit-update-ranges): Pass offset to
treesit--update-ranges-local.

lisp/treesit.el

index d40088178fc7d97e3426b22515e8e34c1f9dc1c1..a26625eca57cdcdb454b87a1c59577bffa0007d9 100644 (file)
@@ -736,7 +736,7 @@ it."
         (delete-overlay ov)))))
 
 (defun treesit--update-ranges-local
-    (query embedded-lang modified-tick &optional beg end)
+    (query embedded-lang modified-tick &optional beg end offset)
   "Update range for local parsers between BEG and END.
 Use QUERY to get the ranges, and make sure each range has a local
 parser for EMBEDDED-LANG.
@@ -748,11 +748,16 @@ property.
 When this function touches an overlay, it sets the
 `treesit-parser-ov-timestamp' property of the overlay to
 MODIFIED-TICK.  This will help Emacs garbage-collect overlays that
-aren't in use anymore."
+aren't in use anymore.
+
+OFFSET is a cons of start and end offsets that are applied to the range
+for the local parser."
   ;; Update range.
   (let* ((host-lang (treesit-query-language query))
          (host-parser (treesit-parser-create host-lang))
-         (ranges (treesit-query-range host-parser query beg end)))
+         (ranges (treesit-query-range host-parser query beg end))
+         (offset-left (or (car offset) 0))
+         (offset-right (or (cdr offset) 0)))
     (pcase-dolist (`(,beg . ,end) ranges)
       (let ((has-parser nil))
         (setq
@@ -780,7 +785,8 @@ aren't in use anymore."
             (overlay-put ov 'treesit-parser-ov-timestamp
                          modified-tick)
             (treesit-parser-set-included-ranges
-             embedded-parser `((,beg . ,end)))))))))
+             embedded-parser `((,(+ beg offset-left)
+                                . ,(+ end offset-right))))))))))
 
 (defun treesit-update-ranges (&optional beg end)
   "Update the ranges for each language in the current buffer.
@@ -803,7 +809,7 @@ region."
          ((functionp query) (funcall query beg end))
          (local
           (treesit--update-ranges-local
-           query language modified-tick beg end))
+           query language modified-tick beg end offset))
          (t
           (let* ((host-lang (treesit-query-language query))
                  (parser (treesit-parser-create language))